/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vaccination;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.log4j.PropertyConfigurator;
import utils.DBController;
import utils.DBResultSet;
import utils.User;
import utils.Utils;

/**
 *
 * @author PacosHome
 */
public class Dottore_PazientiConfermati extends HttpServlet {
    private static org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(Dottore_PazientiConfermati.class); //avvio logger di log4j
    @Override
    public void init() {
        PropertyConfigurator.configure(Dottore_PazientiConfermati.class.getClassLoader().getResource("utils/log4j.properties"));
    }
    
    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        HttpSession session = request.getSession();
        User loggedUser = (User)session.getAttribute("user");
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        DBController dbController = DBController.getInstance();
        
        try {
            
            Utils.printHeader(request, out, "Inserimento vaccinazioni");
            
            out.println("           <div class=\"container-fluid-medium\">\n" +
                        "               <div class=\"row-fluid\">\n" +
                        "                    <div class=\"span6\">\n" +
                        "                        <div class=\"well\">\n" +
                        "                            <ul class=\"nav nav-list\">\n" +
                        "                              <li class=\"nav-header\">Vaccini</li>\n" +
                        "                              <li><a href=\"../dottore_proceduraRichiamoPazienti.html\">Procedura Richiamo Pazienti</a></li>\n" +
                        "                              <li><a href=\"#\">- Lista</a></li>\n" +
                        "                              <li><a href=\"javascript:history.back()\">- Conferma</a></li>\n" +
                        "                              <li class=\"active\"><a href=\"#\">- Lettere</a></li>\n" +
                        "                              <hr>" +
                        "                              <li><a href=\"../dottore_visualizzaRichiamati.html\">Visualizza Pazienti Richiamati</a></li>\n" +
                        "                              <li class=\"nav-header\">Utente</li>\n" +
                        "                              <li><a href=\"Home\">Home</a></li>\n" +
                        "                              <li><a href=\"#\">Modifica Dati</a></li>\n" +
                        "                              <li><a href=\"Logout\">Logout</a></li>\n" +
                        "                            </ul>\n" +
                        "                        </div>\n" +
                        "                    </div>\n" +
                        "                    <div class=\"well span6\" style=\"padding:10px;\">\n" +
                        "                       <div>\n");
            
            ArrayList<String> parameters = Utils.toList(request.getParameterNames());  
            Timestamp dateVaccinations = (Timestamp) session.getAttribute("dateVaccinations-"+loggedUser.getId());
            dbController.registerVaccinations(loggedUser.getId(), parameters, dateVaccinations);            
            String pdfName = createPdf(loggedUser, parameters);

            out.println("                           <h2>Vaccinazioni registrate.</h2>");
            if(!pdfName.isEmpty()) {
            out.println("                           <p id=\"pdf\">"
                      + "                               Clicca <a href=\"" + Utils.getPath(request.getContextPath()+"\\letters"+"\\"+loggedUser.getUsername()+"\\"+pdfName) + "\" target=\"_self\">qui</a> "
                      + "                               per scaricare le lettere degli appuntamenti."
                      + "                           </p>");
            }
            
            Utils.printFooter(out);
            
        } catch(Exception e) {
            //stampa tramite log4j il messaggio dell'eccezione e restituisce la pagine di errore
            log.error(e.getMessage());            
            Utils.printHeader(request, out, "Errore!");
            Utils.printError(request, out, e.getMessage());
            Utils.printFooter(out);
        } finally {            
            out.close();
        }
    }
    
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
    
   
    
    
    private String createPdf(User doctor, ArrayList<String> patientIds) throws SQLException {
        // creazione del pdf
        Document document = new Document(PageSize.A4, 50, 50, 50, 50);
        Calendar cal = Calendar.getInstance();
        DBController dbController = DBController.getInstance();
        String fileName = cal.getTimeInMillis()+".pdf";
        try {
            String pathBuild = getServletContext().getRealPath("/")+"letters\\"+doctor.getUsername();
            String newPath = pathBuild.replace("build\\web\\","web\\" );
            // crea tutte le cartelle necessarie dove inserire il file se necessario
            File f = new File(newPath);
            
            f.mkdirs();
            
            // creazione di un write per il documento
            PdfWriter.getInstance(document, new FileOutputStream(newPath+"\\"+fileName));

            // informazioni sul documento (metadati)
            document.addTitle("Vaccinazioni - Lettere Pazienti da Vaccinare");
            document.addAuthor("Dottor " + doctor.getName() + " " + doctor.getSurname());
            document.addSubject("Pazienti vaccinati dal 10 al 12.");
            document.addCreator("Vaccinazioni 1.0 - using iText");

            document.open();
            
            DBResultSet dbResult = dbController.getPatientsInfo(patientIds);
            ResultSet patients = dbResult.getResultSet();
            // creiamo un'arraylist di utenti per ogni paziente a cui serve inviare la lettera
            // chiamiamo quindi la funzione addLetter che crea la lettera di un singolo paziente e la inserisce nel documento
            if(patients != null) {
                ArrayList<User> patientList = new ArrayList<User>();
                while(patients.next()) {
                    patientList.add(new User(patients.getInt("id"), patients.getString("name"), patients.getString("surname"), patients.getString("username"), patients.getString("password"), patients.getString("photo"), patients.getDate("birthdate")));
                }
                dbController.releaseConnection(dbResult);
                
                for(int i=0;i<patientList.size();i++){
                    addLetter(document, patientList.get(i));
                    document.newPage();
                }

            }
            
        } catch (Exception e) {
            log.error(e.getMessage());
            fileName = "";
        } finally {
            document.close();
        }
        return fileName;
    }
    
    
    
    private void addLetter(Document document, User patient)
            throws DocumentException, java.net.MalformedURLException, IOException, SQLException{
        
        //TITOLO
        Paragraph title1 = new Paragraph("Azienda Sanitaria Regionale", FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLDITALIC, BaseColor.DARK_GRAY));
        document.add(title1);

        Image jpg = Image.getInstance(getServletContext().getRealPath("/") + "images" + "/" + patient.getPhoto());
        jpg.setAlignment (Element.ALIGN_RIGHT);
        document.add(jpg);

        Paragraph p1 = new Paragraph(new Chunk( "Gentile "+patient.getName()+" "+patient.getSurname()+" ,", FontFactory.getFont(FontFactory.HELVETICA, 14)));
        document.add(p1);

        DBController dbController = DBController.getInstance();
        DBResultSet vaccinationSet = dbController.getVaccinations(patient.getId());
        vaccinationSet.getResultSet().next();
        
        // aggiungo l'ultima vaccinazione effettuata (durante la procedura appena completata)
        Timestamp t = vaccinationSet.getResultSet().getTimestamp("date");
        String formattedDate = Utils.formatDate(t);
        String formattedTime = Utils.formatTime(t);


        Paragraph p2 = new Paragraph( new Phrase("la informiamo che in data "
                + formattedDate
                +" presso l'ospeadale del capoluogo verranno effettuate "
                + "le vaccinazioni.\n\n", FontFactory.getFont(FontFactory.HELVETICA, 12)));
        p2.setIndentationLeft(10);
        document.add(p2);

        Paragraph p3 = new Paragraph(new Phrase("orario: "+ formattedTime
                +"\nluogo: Centro sanitario. L'ambulatorio delle vaccinazioni è al 2° piano.\n\n",
                FontFactory.getFont(FontFactory.HELVETICA, 12)));
        p3.setIndentationLeft(40);
        document.add(p3);
        
        // stampo le precedenti vaccinazioni se esistenti
        Paragraph p4 = new Paragraph(new Phrase("Riportiamo di seguito la lista "
                + "delle sue precedenti vaccinazioni:",
                FontFactory.getFont(FontFactory.HELVETICA, 12)));

        p4.setIndentationLeft(10);

        Paragraph p5 = new Paragraph();
        p5.setFont(FontFactory.getFont(FontFactory.HELVETICA, 12));
        p5.setIndentationLeft(30);
        
        Paragraph p6 = new Paragraph(new Phrase("Nessuna precedente vaccinazione",
                FontFactory.getFont(FontFactory.HELVETICA, 12)));
        p6.setIndentationLeft(30);
        
        if(!vaccinationSet.getResultSet().next()){
            document.add(p6);
        } else {
            do{
                formattedDate = Utils.formatDateTime(vaccinationSet.getResultSet().getTimestamp("date"));
                p5.add(new Phrase("\u2022 " + formattedDate + " effettuata dal dott. "
                        + vaccinationSet.getResultSet().getString("surname") +" \n",
                        FontFactory.getFont(FontFactory.HELVETICA, 12)));
            } while(vaccinationSet.getResultSet().next());
            document.add(p4);
            document.add(p5);
        }
        
        //rilascio la connessione
        dbController.releaseConnection(vaccinationSet);
    }
}
